package com.daji.io_nio.channel;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

/*
    如何测试：
    启动main函数，然后观察输出
    浏览器地址栏输入 127.0.0.1:1234 ，然后再观察控制台输出。
    浏览器会短暂出现：Hello java nio.
* */
public class ServerSocketChannelDemo {
    public static final String GREETING = "Hello java nio.\r\n";
    public static void main(String[] argv) throws Exception {
        //自定义一个端口号
        int port = 1234;
        if (argv.length > 0) {
            port = Integer.parseInt(argv[0]);
        }

        //创建一个buffer，把数据放在一个字节数组中，getBytes转换成字节数组
        ByteBuffer buffer = ByteBuffer.wrap(GREETING.getBytes());
        //创建一个ServerSocketChannel
        ServerSocketChannel ssc = ServerSocketChannel.open();
        //绑定端口号（是socket绑定上。不信可以看源码）
        ssc.socket().bind(new InetSocketAddress(port));
        //设置非阻塞模式
        //思考 如果改成了true，就是阻塞模式，咱们可以试试改成true会怎么样
        //思考 如果改成了true，就是阻塞模式，咱们可以试试改成true会怎么样
        //思考 如果改成了true，就是阻塞模式，咱们可以试试改成true会怎么样
        ssc.configureBlocking(false);
        //死循环。一直监听有没有新的连接传入
        while (true) {
            System.out.println("Waiting for connections");
            SocketChannel sc = ssc.accept();    //sc如果是null，就没有新连接传入
            if (sc == null) {
                System.out.println("null");
                Thread.sleep(2000);
            } else {
                System.out.println("Incoming connection from: " +
                        sc.socket().getRemoteSocketAddress());
                buffer.rewind();//指针指向0
                sc.write(buffer);//写操作， 把数据（Hello java nio）写入buffer
                sc.close();
            }
        }
    }
}
